'    Copyright 2008 Jan Molnar <jan.molnar@abds.de>
'
'    This file is part of JCQ.

'    JCQ is free software: you can redistribute it and/or modify
'    it under the terms of the GNU General Public License as published by
'    the Free Software Foundation, either version 2 of the License, or
'    (at your option) any later version.

'    JCQ is distributed in the hope that it will be useful,
'    but WITHOUT ANY WARRANTY; without even the implied warranty of
'    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'    GNU General Public License for more details.

'    You should have received a copy of the GNU General Public License
'    along with JCQ. If not, see <http://www.gnu.org/licenses/>.

Public Class ActivityManager
    Inherits Service
    Implements Interfaces.IActivityManager

    Private _Activites As NotifyingCollection(Of Interfaces.IActivity)
    Private _ReadOnlyActivities As ReadOnlyNotifyingCollection(Of Interfaces.IActivity)
    Private _IdCounter As Integer = 0

    Public Sub New()
        _Activites = New NotifyingCollection(Of Interfaces.IActivity)
        _ReadOnlyActivities = New ReadOnlyNotifyingCollection(Of Interfaces.IActivity)(_Activites)
    End Sub

    Public ReadOnly Property Activities() As Interfaces.IReadOnlyNotifyingCollection(Of Interfaces.IActivity) Implements Interfaces.IActivityManager.Activities
        Get
            Return _ReadOnlyActivities
        End Get
    End Property

    Private Function GetNextId() As Integer
        Return Threading.Interlocked.Increment(_IdCounter)
    End Function

    Public Function CreateActivity(Of T As Interfaces.IActivity)() As T Implements Interfaces.IActivityManager.CreateActivity
        Dim activityType As Type = GetType(T)
        Dim activity As T = DirectCast(Activator.CreateInstance(activityType, New Object() {GetNextId()}), T)

        _Activites.Add(activity)

        Kernel.Logger.Log("ActivityManager", TraceEventType.Information, "Activity [{0}] created.", activity.Name)

        Return activity
    End Function

    Public Function CreateAndRunActivity(Of T As Interfaces.IActivity)() As T Implements Interfaces.IActivityManager.CreateAndRunActivity
        Dim activity As T = CreateActivity(Of T)()

        activity.Run()

        Return activity
    End Function

    Public Function CreateAndRunAsyncActivity(Of T As Interfaces.IActivity)() As T Implements Interfaces.IActivityManager.CreateAndRunAsyncActivity
        Dim activity As T = CreateActivity(Of T)()

        activity.RunAsync()

        Return activity
    End Function
End Class
